package com.atguigu.spring.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.atguigu.spring.component.HappyComponent;
import com.atguigu.spring.component.HappyMachine;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;

@Configuration // 让当前类成为配置类，相当于 application.xml
@ComponentScan(basePackages = "com.atguigu.spring") // 配置自动扫描的包
@PropertySource(value = {"classpath:atguigu.properties", "classpath:jdbc.properties"}) // 加载外部属性文件
@Import({BigConfig.class, UserBeanConfig.class}) // 导入其它配置类中的 bean 声明
public class AtguiguConfig {

    // 什么时候使用 @Bean 注解呢？
    // 答：想要加入 IOC 容器的类，来自于 jar 包，只读的，我们无法加 @Component 之类的注解
    // @Bean 注解修饰方法，方法的返回值会被放入 IOC 容器
    // 如果没有指定 beanName，默认方法名作为 beanName
    // 也可以在 @Bean 注解中人为指定 beanName
    @Bean("appleSource")
    public DruidDataSource getDruidDataSource(
            @Value("${jdbc.url}") String url,
            @Value("${jdbc.user}") String userName,
            @Value("${jdbc.password}") String password,
            @Value("${jdbc.driver}") String driverClassName) {

        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(userName);
        druidDataSource.setPassword(password);
        druidDataSource.setDriverClassName(driverClassName);

        return druidDataSource;
    }

    @Bean
    public HappyMachine getHappyMachine() {

        return new HappyMachine();
    }

    @Bean
    public HappyComponent getHappyComponent() {

        HappyComponent happyComponent = new HappyComponent();

        // 需要用到另一个 bean，可以调用 @Bean 注解标记的那个方法
        // 注意：调用这个方法表示从 IOC 容器中获取 bean 对象，即使这个方法多次调用，也不会导致创建多个对象
        // 因为调用这个方法前会先看 IOC 容器中有没有，如果有，就不会真的调用这个方法
        HappyMachine happyMachine = getHappyMachine();

        happyComponent.setHappyMachine(happyMachine);

        return happyComponent;
    }
}
